home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Utilities / Text and Speech / BBEdit 2.2.2 / BBEdit Extensions / Sources / CutContaining.c < prev    next >
C/C++ Source or Header  |  1992-09-09  |  2KB  |  143 lines

  1. #include <SetupA4.h>
  2. #include "ExternalInterface.h"
  3. #include "DialogUtilities.h"
  4.  
  5. static void maintain_buttons(DialogPtr d)
  6. {
  7.     Boolean enable;
  8.     Str255 s;
  9.     
  10.     ReadStrItem(d, 4, s);
  11.     enable = (s[0] != 0);
  12.     
  13.     if (enable != TestDlgCtl(d, 1))
  14.         XAbleDlgCtl(d, 1, enable);
  15. }
  16.  
  17. pascal Boolean (*std_filter)(DialogPtr d, EventRecord *event, short *item);
  18.  
  19. static pascal Boolean filter(DialogPtr d, EventRecord *event, short *item)
  20. {    
  21.     Boolean result;
  22.     
  23.     SetUpA4();
  24.     
  25.     maintain_buttons(d);
  26.     
  27.     result = std_filter(d, event, item);
  28.     
  29.     RestoreA4();
  30.     
  31.     return result;
  32. }
  33.  
  34. pascal void main(ExternalCallbackBlock *callbacks, WindowPtr w)
  35. {
  36.     long line_count;
  37.     long line;
  38.     
  39.     long line_start;
  40.     long line_end;
  41.     
  42.     Handle text;
  43.     
  44.     Handle    copy;
  45.     Boolean    found;
  46.     
  47.     Str255 search_str;
  48.     Boolean case_sensitive;
  49.  
  50.     DialogPtr d;
  51.     GrafPtr save_port;
  52.     
  53.     short item;
  54.         
  55.     long offset;
  56.     
  57.     OSErr err;
  58.     
  59.     RememberA0();
  60.     SetUpA4();
  61.     
  62.     case_sensitive = FALSE;
  63.     
  64.     GetPort(&save_port);
  65.     d = callbacks->CenterDialog(128);
  66.     SetPort(d);
  67.     
  68.     std_filter = callbacks->StandardFilter;
  69.     
  70.     do {
  71.         ModalDialog(filter, &item);
  72.         if (item == 3)
  73.         {
  74.             case_sensitive = ! case_sensitive;
  75.             SetDlgCtl(d, item, case_sensitive);
  76.         }
  77.     } while ((item != 1) && (item != 2));
  78.     
  79.     ReadStrItem(d, 4, search_str);
  80.         
  81.     DisposDialog(d);
  82.     SetPort(save_port);
  83.     
  84.     if (item == 1)
  85.     {
  86.         line_count = callbacks->GetLastLine();
  87.         text = callbacks->GetWindowContents(w);
  88.         
  89.         found = FALSE;
  90.         copy = NewHandle(0);
  91.     
  92.         err = noErr;
  93.         
  94.         for (line = 0; line < line_count; line++)
  95.         {
  96.             line_start = callbacks->GetLinePos(line);
  97.             line_end = callbacks->GetLineEnd(line_start);
  98.             
  99.             offset = callbacks->FindPattern(*text, line_end, line_start,
  100.                                             (char *)&search_str[1], search_str[0],
  101.                                             case_sensitive);
  102.                                             
  103.             if (offset >= 0)
  104.             {
  105.                 MoveHHi(text);
  106.                 HLock(text);
  107.                 
  108.                 err = PtrAndHand(*text + line_start, copy, line_end - line_start + 1);
  109.                 HUnlock(text);
  110.                                 
  111.                 callbacks->SetSelection(line_start, line_end + 1, callbacks->GetLineNumber(line_start));
  112.                 callbacks->Delete();
  113.                 
  114.                 if (err)
  115.                     break;
  116.                 
  117.                 found = TRUE;
  118.                 
  119.                 line--;            //    because it'll get incremented at the bottom of the loop
  120.                 line_count--;    //    because we deleted a line
  121.             }
  122.         }
  123.         
  124.         if (err)
  125.             callbacks->ReportOSError(err);
  126.         else 
  127.         {
  128.             if (found)
  129.             {
  130.                 HLock(copy);
  131.                 ZeroScrap();
  132.                 PutScrap(GetHandleSize(copy), 'TEXT', *copy);
  133.             }
  134.             else
  135.                 SysBeep(2);
  136.         }
  137.         
  138.         DisposHandle(copy);
  139.     }
  140.     
  141.     RestoreA4();
  142. }
  143.